#ifndef HTTP_REQUEST
#define HTTP_REQUEST 1
//获得 请求报文
//请求报文有三部分 
//请求行：  请求方法 + URL + 协议号/版本号 |行尾加 \r\n
//请求头：  均以键值对出现 属性名:属性值   |行尾加 \r\n
//请求体： 报文体,界面组件中的回传值 param1=value1 |行尾加\r\n
//请求报文的最后一行 行尾 必须加\r\n\r\n 构成一行 ‘空行’
//exmaple
//
//GET / HTTP/1.1
//User-Agent: curl/7.29.0
//Host: www.baidu.com
//Accept: */* 
//
//键值的数据模型采用 c++11 unordered_map、unordered_set 
//在处理 报文体/请求体 时，对 "&" 的检索 可以用 '\0'来处理字符串
#include "../buffer/buff.h"
#include "../Logg/log.h"
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
static const  char CRLF[3] = "\r\n";
enum Method
{
    kGet,kPost,kPut,kHead,kDelete,kInvalid
};
enum Version
{
    kUnknown,kHttp10,kHttp11
};
enum httpRequestStatus
{
    ParseRequestLine,                   //解析请求行
    ParseHead,                          //...请求头
    ParseBody,                          //...请求体
    ParseFinsh,                         //解析完成
    ParseErrno                          //解析出错
};
class HttpRequest
{
public:

public:
    HttpRequest(){ init(); }
    ~HttpRequest() = default;
    void init();

    std::string getMethod();
    std::string getVersion();
    std::string path() const;
    std::string& path();

    bool Parse(Buffer_::Buffer& buff);
    bool Parsepath();
    bool ParseLine(std::string &buff);
    bool ParseHeader(std::string buff);
    bool Parsebody(/*std::string& buff**/);
    bool isKeepAlive() const;

private:
    httpRequestStatus ParseStatus_;

    std::string method_,path_,version_,body_;

    std::unordered_map<std::string,std::string> Head_;

    //不一定要这个
    std::unordered_map<std::string,std::string> Body_;

    static const std::unordered_set<std::string> DEFAULT_HTML;
};
#endif